package cn.weforward.task.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import cn.weforward.common.NameItem;
import cn.weforward.common.ResultPage;
import cn.weforward.common.util.ResultPageHelper;
import cn.weforward.common.util.StringUtil;
import cn.weforward.data.UniteId;
import cn.weforward.data.counter.CounterFactory;
import cn.weforward.data.log.BusinessLoggerFactory;
import cn.weforward.data.persister.Condition;
import cn.weforward.data.persister.PersisterFactory;
import cn.weforward.data.persister.ext.ConditionUtil;
import cn.weforward.framework.ApiException;
import cn.weforward.framework.util.ValidateUtil;
import cn.weforward.task.Bug;
import cn.weforward.task.Tag;
import cn.weforward.task.Task;
import cn.weforward.task.TaskService;

public class TaskServiceImpl extends TaskDiImpl implements TaskService{

	public TaskServiceImpl(PersisterFactory factory,
			BusinessLoggerFactory loggerFactory) {
		super(factory,loggerFactory);
	}

	@Override
	public Task createTask(String title, String content, String fatherTaskId, String manager, List<String> handlers,
			String tag, int priority, Date expectedStartTime, Date expectedEndTime) {
		// TODO Auto-generated method stub
		return new SimpleTask(this, title, content, fatherTaskId, manager, handlers, tag, priority, expectedStartTime, expectedEndTime);
	}

	@Override
	public Task getTask(String id) {
		return m_PsTask.get(id);
	}
	//搜索已完成的任务
	@Override
	public ResultPage<SimpleTask> searchFinishedTasks(int options) {
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			if(!isFinishedMatch(task,options)) {
				continue;
			}
			list.add(task);
		}
		return ResultPageHelper.toResultPage(list);
	}
	//搜索未完成的任务
	@Override
	public ResultPage<SimpleTask> searchUnfinishedTasks(int options) {
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			if(!isUnfinishedMatch(task,options)) {
				continue;
			}
			list.add(task);
		}
		return ResultPageHelper.toResultPage(list);
	}
	
	/**
	 * 匹配任务状态是否属于已完成
	 * @param task
	 * @param options
	 * @return
	 */
	private boolean isFinishedMatch(Task task,int options) {
		if(null == task) {
			return false;
		}
		NameItem state = task.getState();
		//如果用户希望搜索已完成的任务，但该任务状态不匹配
		if(options >= OPTION_PASS_TEST && state.id < Task.STATE_PASS_TEST.id) {
			return false;
		}
		return true;
	}
	/**
	 * 匹配任务状态是否属于未完成
	 * @param task
	 * @param options
	 * @return
	 */
	private boolean isUnfinishedMatch(Task task,int options) {
		if(null == task) {
			return false;
		}
		NameItem state = task.getState();
		//如果用户希望搜索未完成的任务，但该任务状态不匹配
		if(options < OPTION_PASS_TEST && state.id >= Task.STATE_PASS_TEST.id) {
			return false;
		}
		return true;
	}
	
	/**
	 * 搜索指定负责人已完成的任务
	 */
	public ResultPage<SimpleTask> findFinishedTaskByManager(String manager){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			String taskManager = task.getManager();
			
			if(taskManager.equals(manager) && task.getState().id >= Task.STATE_PASS_TEST.id) {
				//如果该任务处理人包含指定的负责人,且任务通过测试，获取该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}
	
	/**
	 * 搜索指定负责人未完成的任务
	 */
	public ResultPage<SimpleTask> findUnfinishedTaskByManager(String manager){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			String taskManager = task.getManager();
			
			if(taskManager.equals(manager) && task.getState().id < Task.STATE_PASS_TEST.id) {
				//如果该任务处理人包含指定的负责人,且任务通过测试，获取该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}
	
	/**
	 * 搜索指定处理人已完成的任务
	 */
	public ResultPage<SimpleTask> findFinishedTaskByHandler(List<String> handlers){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			List<String> list2 = task.getHandlers();
			if(list2.containsAll(handlers) && task.getState().id >= Task.STATE_PASS_TEST.id) {
				//如果该任务处理人包含指定的处理人且任务已完成,取得该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}
	/**
	 * 搜索指定处理人未完成的任务
	 */
	public ResultPage<SimpleTask> findUnfinishedTaskByHandler(List<String> handlers){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			List<String> list2 = task.getHandlers();
			if(list2.containsAll(handlers) && task.getState().id < Task.STATE_PASS_TEST.id) {
				//如果该任务处理人包含指定的处理人且任务已完成,取得该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}
	
	/**
	 * 搜索指定最新跟进人已完成的任务
	 */
	public ResultPage<SimpleTask> findFinishedTaskByFollower(String follower){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			List<String> Taskfollowers = task.getFollower();
			if(Taskfollowers.size()>0 && Taskfollowers.get(Taskfollowers.size()-1).equals(follower) && task.getState().id >= Task.STATE_PASS_TEST.id) {
				//如果该任务最新的跟进人包含要指定的跟进人且任务已通过测试,取得该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}
	
	/**
	 * 搜索指定最新跟进人未完成的任务
	 */
	public ResultPage<SimpleTask> findUnfinishedTaskByFollower(String follower){
		//将所有数据拿出来
		ResultPage<? extends Task> rp = m_PsTask.startsWith("");
		List<Task> list = new ArrayList<>();
		for(Task task : ResultPageHelper.toForeach(rp)) {
			List<String> taskFollowers = task.getFollower();
			if(taskFollowers.size()>0 && taskFollowers.get(taskFollowers.size()-1).equals(follower) && task.getState().id < Task.STATE_PASS_TEST.id) {
				//如果该任务最新的跟进人包含要指定的跟进人且任务已通过测试,取得该任务
				list.add(task);
			}
		}
		return ResultPageHelper.toResultPage(list);
	}

	/**
	 * 新建Tag
	 */
	@Override
	public Tag createTag(String name,int state) {
		return new SimpleTag(this, name, state);
	}

	@Override
	public ResultPage<SimpleTag> searchAllTags() {
		//将所有数据拿出来
		ResultPage<SimpleTag> rp = m_PsTag.startsWith("");
		return rp;
	}
	
	@Override
	public ResultPage<Tag> searchTags(String keywords,int options) {
		//将所有数据拿出来
		ResultPage<? extends Tag> rp = m_PsTag.startsWith("");
		List<Tag> list = new ArrayList<>();
		for(Tag tag : ResultPageHelper.toForeach(rp)) {
			if(!isMatch(tag,keywords)) {
				continue;
			}
			if(!isMatch(tag, options)) {
				continue;
			}
			list.add(tag);
		}
		return ResultPageHelper.toResultPage(list);
	}

	private boolean isMatch(Tag tag, String keywords) {
		// TODO Auto-generated method stub
		if(null == tag) {
			return false;
		}
		String n = tag.getName();
		//如果该tag的名字为空
		if(StringUtil.isEmpty(n)) {
			return false;
		}
		//name是否包含keywords，返回对应的boolean值
		return n.contains(keywords);
	}
	private boolean isMatch(Tag tag,int options) {
		if (null == tag) {
			return false; 
		}
		NameItem state = tag.getState();
		//如果用户对要搜索的标签状态无要求
		if(OPTION_NONE == options) {
			return true;
		}
		//如果用户希望搜索的标签状态是隐藏的，但是该标签状态不匹配
		if(OPTION_HIDE == options && state.id != Tag.STATE_HIDE.id) {
			return false;
		}
		//如果用户希望搜索的标签状态是显示的，但是该标签状态不匹配
		if(OPTION_SHOW == options && state.id != Tag.STATE_SHOW.id) {
			return false;
		}
		return true;
	}

	/**
	 * 根据id查询标签
	 */
	@Override
	public Tag getTag(String id) {
		// TODO Auto-generated method stub
		return m_PsTag.get(id);
	}
	/**
	 * 根据id删除标签
	 * @throws ApiException 
	 */
	@Override
	public void removeTag(String id) throws ApiException {
		//删除前，先查询该标签下是否还有任务
		ResultPage<SimpleTask> rp = searchTasks(id);
		if(rp.getCount()==0) {
			//如果查询到该标签下没有任务,则删除
			m_PsTag.remove(id);
			return;
		}
		throw new ApiException(10002, "标签删除失败，因为该标签下还有任务，请先转移任务后删除标签");
	}
	/**
	 * 获取所有任务
	 */
	@Override
	public ResultPage<SimpleTask> searchAllTasks() {
		//如果查询到任务的父任务id属性为空字符串，代表是父任务
		ResultPage<SimpleTask> rp = m_PsTask.search(ConditionUtil.eq(ConditionUtil.field("m_FatherTaskId"), ""));
		return rp;
	}

	@Override
	public Bug getBug(String id) {
		return m_PsBug.get(id);
	}




}
